home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- '''Utilities for obtaining speech utterances for objects. In general,
- there probably should be a singleton instance of the SpeechGenerator
- class. For those wishing to override the speech generators, however,
- one can create a new instance and replace/extend the speech generators
- as they see fit.'''
- __id__ = '$Id: speechgenerator.py 4471 2009-01-28 17:52:43Z wwalker $'
- __version__ = '$Revision: 4471 $'
- __date__ = '$Date: 2009-01-28 12:52:43 -0500 (Wed, 28 Jan 2009) $'
- __copyright__ = 'Copyright (c) 2005-2008 Sun Microsystems Inc.'
- __license__ = 'LGPL'
- import pyatspi
- import debug
- import orca_state
- import rolenames
- import settings
- from orca_i18n import _
- from orca_i18n import ngettext
- from orca_i18n import C_
-
- class SpeechGenerator:
- '''Takes accessible objects and produces a string to speak for
- those objects. See the getSpeech method, which is the primary
- entry point. Subclasses can feel free to override/extend the
- speechGenerators instance field as they see fit.'''
-
- def __init__(self, script):
- self._script = script
- self.speechGenerators = { }
- self.speechGenerators[pyatspi.ROLE_ALERT] = self._getSpeechForAlert
- self.speechGenerators[pyatspi.ROLE_ANIMATION] = self._getSpeechForAnimation
- self.speechGenerators[pyatspi.ROLE_ARROW] = self._getSpeechForArrow
- self.speechGenerators[pyatspi.ROLE_CHECK_BOX] = self._getSpeechForCheckBox
- self.speechGenerators[pyatspi.ROLE_CHECK_MENU_ITEM] = self._getSpeechForCheckMenuItem
- self.speechGenerators[pyatspi.ROLE_COLUMN_HEADER] = self._getSpeechForColumnHeader
- self.speechGenerators[pyatspi.ROLE_COMBO_BOX] = self._getSpeechForComboBox
- self.speechGenerators[pyatspi.ROLE_DESKTOP_ICON] = self._getSpeechForDesktopIcon
- self.speechGenerators[pyatspi.ROLE_DIAL] = self._getSpeechForDial
- self.speechGenerators[pyatspi.ROLE_DIALOG] = self._getSpeechForDialog
- self.speechGenerators[pyatspi.ROLE_DIRECTORY_PANE] = self._getSpeechForDirectoryPane
- self.speechGenerators[pyatspi.ROLE_EMBEDDED] = self._getSpeechForEmbedded
- self.speechGenerators[pyatspi.ROLE_FRAME] = self._getSpeechForFrame
- self.speechGenerators[pyatspi.ROLE_HTML_CONTAINER] = self._getSpeechForHtmlContainer
- self.speechGenerators[pyatspi.ROLE_ICON] = self._getSpeechForIcon
- self.speechGenerators[pyatspi.ROLE_IMAGE] = self._getSpeechForImage
- self.speechGenerators[pyatspi.ROLE_LABEL] = self._getSpeechForLabel
- self.speechGenerators[pyatspi.ROLE_LAYERED_PANE] = self._getSpeechForLayeredPane
- self.speechGenerators[pyatspi.ROLE_LIST] = self._getSpeechForList
- self.speechGenerators[pyatspi.ROLE_LIST_ITEM] = self._getSpeechForListItem
- self.speechGenerators[pyatspi.ROLE_MENU] = self._getSpeechForMenu
- self.speechGenerators[pyatspi.ROLE_MENU_BAR] = self._getSpeechForMenuBar
- self.speechGenerators[pyatspi.ROLE_MENU_ITEM] = self._getSpeechForMenuItem
- self.speechGenerators[pyatspi.ROLE_OPTION_PANE] = self._getSpeechForOptionPane
- self.speechGenerators[pyatspi.ROLE_PAGE_TAB] = self._getSpeechForPageTab
- self.speechGenerators[pyatspi.ROLE_PAGE_TAB_LIST] = self._getSpeechForPageTabList
- self.speechGenerators[pyatspi.ROLE_PARAGRAPH] = self._getSpeechForText
- self.speechGenerators[pyatspi.ROLE_PASSWORD_TEXT] = self._getSpeechForText
- self.speechGenerators[pyatspi.ROLE_PROGRESS_BAR] = self._getSpeechForProgressBar
- self.speechGenerators[pyatspi.ROLE_PUSH_BUTTON] = self._getSpeechForPushButton
- self.speechGenerators[pyatspi.ROLE_RADIO_BUTTON] = self._getSpeechForRadioButton
- self.speechGenerators[pyatspi.ROLE_RADIO_MENU_ITEM] = self._getSpeechForRadioMenuItem
- self.speechGenerators[pyatspi.ROLE_ROW_HEADER] = self._getSpeechForRowHeader
- self.speechGenerators[pyatspi.ROLE_SCROLL_BAR] = self._getSpeechForScrollBar
- self.speechGenerators[pyatspi.ROLE_SLIDER] = self._getSpeechForSlider
- self.speechGenerators[pyatspi.ROLE_SPIN_BUTTON] = self._getSpeechForSpinButton
- self.speechGenerators[pyatspi.ROLE_SPLIT_PANE] = self._getSpeechForSplitPane
- self.speechGenerators[pyatspi.ROLE_TABLE] = self._getSpeechForTable
- self.speechGenerators[pyatspi.ROLE_TABLE_CELL] = self._getSpeechForTableCellRow
- self.speechGenerators[pyatspi.ROLE_TABLE_COLUMN_HEADER] = self._getSpeechForTableColumnHeader
- self.speechGenerators[pyatspi.ROLE_TABLE_ROW_HEADER] = self._getSpeechForTableRowHeader
- self.speechGenerators[pyatspi.ROLE_TEAROFF_MENU_ITEM] = self._getSpeechForMenu
- self.speechGenerators[pyatspi.ROLE_TERMINAL] = self._getSpeechForTerminal
- self.speechGenerators[pyatspi.ROLE_TEXT] = self._getSpeechForText
- self.speechGenerators[pyatspi.ROLE_TOGGLE_BUTTON] = self._getSpeechForToggleButton
- self.speechGenerators[pyatspi.ROLE_TOOL_BAR] = self._getSpeechForToolBar
- self.speechGenerators[pyatspi.ROLE_TREE] = self._getSpeechForTable
- self.speechGenerators[pyatspi.ROLE_TREE_TABLE] = self._getSpeechForTable
- self.speechGenerators[pyatspi.ROLE_WINDOW] = self._getSpeechForWindow
-
-
- def _addSpeechForObjectAccelerator(self, obj, utterances):
- '''Adds an utterance that describes the keyboard accelerator for the
- given object to the list of utterances passed in.
-
- Arguments:
- - obj: the Accessible object
- - utterances: the list of utterances to add to.
-
- Returns a list of utterances to be spoken.
- '''
- if settings.speechVerbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
- (mnemonic, shortcut, accelerator) = self._script.getKeyBinding(obj)
- if accelerator:
- utterances.append(accelerator)
-
-
-
-
- def _addSpeechForObjectMnemonic(self, obj, utterances):
- '''Adds an utterance that describes the mnemonic for the given object
- to the utterances passed in.
-
- Arguments:
- - obj: the Accessible object
- - utterances: the list of utterances to add to.
- '''
- if settings.enableMnemonicSpeaking:
- (mnemonic, shortcut, accelerator) = self._script.getKeyBinding(obj)
- if mnemonic:
- mnemonic = mnemonic[-1]
-
- if not mnemonic and shortcut:
- mnemonic = shortcut
-
- if mnemonic:
- utterances.append(mnemonic)
-
-
-
-
- def _getSpeechForObjectAvailability(self, obj):
- '''Returns a list of utterances that describes the availability
- of the given object.
-
- Arguments:
- - obj: the Accessible object
-
- Returns a list of utterances to be spoken.
- '''
- state = obj.getState()
- if not state.contains(pyatspi.STATE_SENSITIVE):
- return [
- _('grayed')]
- return []
-
-
- def _getSpeechForObjectLabel(self, obj):
- label = self._script.getDisplayedLabel(obj)
- if label:
- return [
- label]
- return []
-
-
- def _getSpeechForObjectName(self, obj):
- name = self._script.getDisplayedText(obj)
- if name:
- return [
- name]
- if obj.description:
- return [
- obj.description]
- return []
-
-
- def getSpeechForObjectRole(self, obj, role = None):
- if obj.getRole() != pyatspi.ROLE_UNKNOWN:
- return [
- rolenames.getSpeechForRoleName(obj, role)]
- return []
-
-
- def _getSpeechForAllTextSelection(self, obj):
- """Check if this object has text associated with it and it's
- completely selected.
-
- Arguments:
- - obj: the object being presented
- """
- utterance = []
-
- try:
- textObj = obj.queryText()
- except:
- pass
-
- noOfSelections = textObj.getNSelections()
- if noOfSelections == 1:
- (string, startOffset, endOffset) = textObj.getTextAtOffset(0, pyatspi.TEXT_BOUNDARY_LINE_START)
- if startOffset == 0 and endOffset == len(string):
- utterance = [
- C_('text', 'selected')]
-
-
- return utterance
-
-
- def _getSpeechForRequiredObject(self, obj):
- '''Returns the list of utterances that describe the required state
- of the given object.
-
- Arguments:
- - obj: the Accessible object
-
- Returns a list of utterances to be spoken.
- '''
- if not settings.presentRequiredState:
- return []
- state = obj.getState()
- if state.contains(pyatspi.STATE_REQUIRED):
- return [
- settings.speechRequiredStateString]
- return []
-
-
- def _debugGenerator(self, generatorName, obj, already_focused, utterances):
- '''Prints debug.LEVEL_FINER information regarding the speech generator.
-
- Arguments:
- - generatorName: the name of the generator
- - obj: the object being presented
- - already_focused: False if object just received focus
- - utterances: the generated text
- '''
- debug.println(debug.LEVEL_FINER, 'GENERATOR: %s' % generatorName)
- debug.println(debug.LEVEL_FINER, ' obj = %s' % obj.name)
- debug.println(debug.LEVEL_FINER, ' role = %s' % obj.getRoleName())
- debug.println(debug.LEVEL_FINER, ' already_focused = %s' % already_focused)
- debug.println(debug.LEVEL_FINER, ' utterances:')
- for text in utterances:
- debug.println(debug.LEVEL_FINER, ' (%s)' % text)
-
-
-
- def _getDefaultSpeech(self, obj, already_focused, role = None):
- """Gets a list of utterances to be spoken for the current
- object's name, role, and any accelerators. This is usually the
- fallback speech generator should no other specialized speech
- generator exist for this object.
-
- The default speech will be of the following form:
-
- label name role availability mnemonic
-
- Arguments:
- - obj: an Accessible
- - already_focused: False if object just received focus
- - role: A role that should be used instead of the Accessible's
- possible role.
-
- Returns a list of utterances to be spoken for the object.
- """
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self._getSpeechForAllTextSelection(obj))
- utterances.extend(self.getSpeechForObjectRole(obj, role))
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- if obj == orca_state.locusOfFocus:
- self._addSpeechForObjectMnemonic(obj, utterances)
-
-
- self._debugGenerator('_getDefaultSpeech', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForAlert(self, obj, already_focused):
- '''Gets the title of the dialog and the contents of labels inside the
- dialog that are not associated with any other objects.
-
- Arguments:
- - obj: the Accessible dialog
- - already_focused: False if object just received focus
-
- Returns a list of utterances be spoken.
- '''
- utterances = []
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- labels = self._script.findUnrelatedLabels(obj)
- for label in labels:
- name = self._getSpeechForObjectName(label)
- utterances.extend(name)
-
- self._debugGenerator('_getSpeechForAlert', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForAnimation(self, obj, already_focused):
- '''Gets the speech for an animation.
-
- Arguments:
- - obj: the animation
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken.
- '''
- utterances = []
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- self._debugGenerator('_getSpeechForAnimation', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForArrow(self, obj, already_focused):
- '''Gets a list of utterances to be spoken for an arrow.
-
- Arguments:
- - obj: the arrow
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForArrow', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForCheckBox(self, obj, already_focused):
- '''Get the speech for a check box. If the check box already had
- focus, then only the state is spoken.
-
- Arguments:
- - obj: the check box
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- state = obj.getState()
- if state.contains(pyatspi.STATE_INDETERMINATE):
- checkedState = _('partially checked')
- elif state.contains(pyatspi.STATE_CHECKED):
- checkedState = _('checked')
- else:
- checkedState = _('not checked')
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- if obj.getRole() == pyatspi.ROLE_TABLE_CELL:
- utterances.extend(self.getSpeechForObjectRole(obj, pyatspi.ROLE_CHECK_BOX))
- else:
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.append(checkedState)
- utterances.extend(self._getSpeechForRequiredObject(obj))
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- else:
- utterances.append(checkedState)
- self._debugGenerator('_getSpeechForCheckBox', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForCheckMenuItem(self, obj, already_focused):
- '''Get the speech for a check menu item. If the check menu item
- already had focus, then only the state is spoken.
-
- Arguments:
- - obj: the check menu item
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getSpeechForCheckBox(obj, already_focused)
- if not already_focused:
- self._addSpeechForObjectAccelerator(obj, utterances)
-
- self._debugGenerator('_getSpeechForCheckMenuItem', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForColumnHeader(self, obj, already_focused):
- '''Get the speech for a column header.
-
- Arguments:
- - obj: the column header
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForColumnHeader', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForComboBox(self, obj, already_focused):
- '''Get the speech for a combo box. If the combo box already has focus,
- then only the selection is spoken.
-
- Arguments:
- - obj: the combo box
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- else:
- label = None
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- if not already_focused:
- utterances.extend(self.getSpeechForObjectRole(obj))
-
- for child in obj:
- if child.getRole() == pyatspi.ROLE_TEXT:
- utterances.extend(self._getSpeechForAllTextSelection(child))
- continue
-
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._debugGenerator('_getSpeechForComboBox', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForDesktopIcon(self, obj, already_focused):
- '''Get the speech for a desktop icon.
-
- Arguments:
- - obj: the desktop icon
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForDesktopIcon', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForDial(self, obj, already_focused):
- '''Get the speech for a dial.
-
- Arguments:
- - obj: the dial
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForDial', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForDialog(self, obj, already_focused):
- '''Get the speech for a dialog box.
-
- Arguments:
- - obj: the dialog box
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getSpeechForAlert(obj, already_focused)
- self._debugGenerator('_getSpeechForDialog', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForDirectoryPane(self, obj, already_focused):
- '''Get the speech for a directory pane.
-
- Arguments:
- - obj: the dial
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForDirectoryPane', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForEmbedded(self, obj, already_focused, role = None):
- """Gets a list of utterances to be spoken for the current
- embedded component (i.e., something in a panel).
-
- Arguments:
- - obj: an Accessible
- - already_focused: False if object just received focus
- - role: A role that should be used instead of the Accessible's
- possible role.
-
- Returns a list of utterances to be spoken for the object.
- """
- utterances = []
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- if not utterances:
-
- try:
- utterances.append(obj.getApplication().name)
-
-
- self._debugGenerator('_getSpeechForEmbedded', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForFrame(self, obj, already_focused):
- '''Get the speech for a frame.
-
- Arguments:
- - obj: the frame
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self._getSpeechForAllTextSelection(obj))
- utterances.extend(self.getSpeechForObjectRole(obj))
- alertAndDialogCount = self._script.getUnfocusedAlertAndDialogCount(obj)
- if alertAndDialogCount > 0:
- line = ngettext('%d unfocused dialog', '%d unfocused dialogs', alertAndDialogCount) % alertAndDialogCount
- utterances.append(line)
-
- utterances.extend(self._getSpeechForObjectAvailability(obj))
-
- self._debugGenerator('_getSpeechForFrame', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForHtmlContainer(self, obj, already_focused):
- '''Get the speech for an HTML container.
-
- Arguments:
- - obj: the dial
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForHtmlContainer', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForIcon(self, obj, already_focused):
- '''Get the speech for an icon.
-
- Arguments:
- - obj: the icon
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
-
- try:
- image = obj.queryImage()
- except NotImplementedError:
- pass
-
- description = image.imageDescription
- if description and len(description):
- utterances.append(description)
-
- if settings.speechVerbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
- utterances.append(rolenames.getSpeechForRoleName(obj, pyatspi.ROLE_ICON))
-
- self._debugGenerator('_getSpeechForIcon', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForImage(self, obj, already_focused):
- '''Get the speech for an image.
-
- Arguments:
- - obj: the image
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused, pyatspi.ROLE_IMAGE)
- self._debugGenerator('_getSpeechForImage', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForLabel(self, obj, already_focused):
- '''Get the speech for a label.
-
- Arguments:
- - obj: the label
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForLabel', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForLayeredPane(self, obj, already_focused):
- '''Get the speech for a layered pane
-
- Arguments:
- - obj: the table
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForLayeredPane', obj, already_focused, utterances)
- hasItems = False
- for child in obj:
- state = child.getState()
- if state.contains(pyatspi.STATE_SHOWING):
- hasItems = True
- break
- continue
-
- if not hasItems:
- utterances.append(_('0 items'))
-
- return utterances
-
-
- def _getSpeechForList(self, obj, already_focused):
- '''Get the speech for a list.
-
- Arguments:
- - obj: the list
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForList', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForListItem(self, obj, already_focused):
- '''Get the speech for a listitem.
-
- Arguments:
- - obj: the listitem
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self._getSpeechForAllTextSelection(obj))
-
- state = obj.getState()
- if state.contains(pyatspi.STATE_EXPANDABLE):
- if state.contains(pyatspi.STATE_EXPANDED):
- utterances.append(_('expanded'))
- else:
- utterances.append(_('collapsed'))
-
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._debugGenerator('_getSpeechForListItem', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForMenu(self, obj, already_focused):
- '''Get the speech for a menu.
-
- Arguments:
- - obj: the menu
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self._getSpeechForAllTextSelection(obj))
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._addSpeechForObjectAccelerator(obj, utterances)
-
- self._debugGenerator('_getSpeechForMenu', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForMenuBar(self, obj, already_focused):
- '''Get the speech for a menu bar.
-
- Arguments:
- - obj: the menu bar
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForMenuBar', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForMenuItem(self, obj, already_focused):
- '''Get the speech for a menu item.
-
- Arguments:
- - obj: the menu item
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- state = obj.getState()
- if state.contains(pyatspi.STATE_CHECKED):
- utterances.append(_('checked'))
-
- if not already_focused:
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._addSpeechForObjectAccelerator(obj, utterances)
-
- self._debugGenerator('_getSpeechForMenuItem', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForText(self, obj, already_focused):
- '''Get the speech for a text component.
-
- Arguments:
- - obj: the text component
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- utterances.extend(self._getSpeechForObjectLabel(obj))
- if len(utterances) == 0:
- if obj.name and len(obj.name):
- utterances.append(obj.name)
-
-
- if settings.presentReadOnlyText and self._script.isReadOnlyTextArea(obj):
- utterances.append(settings.speechReadOnlyString)
-
- if obj.getRole() != pyatspi.ROLE_PARAGRAPH:
- utterances.extend(self.getSpeechForObjectRole(obj))
-
- (text, caretOffset, startOffset) = self._script.getTextLineAtCaret(obj)
- utterances.append(text)
- utterances.extend(self._getSpeechForAllTextSelection(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._debugGenerator('_getSpeechForText', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForOptionPane(self, obj, already_focused):
- '''Get the speech for an option pane.
-
- Arguments:
- - obj: the option pane
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForOptionPane', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForPageTab(self, obj, already_focused):
- '''Get the speech for a page tab.
-
- Arguments:
- - obj: the page tab
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForPageTab', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForPageTabList(self, obj, already_focused):
- '''Get the speech for a page tab list.
-
- Arguments:
- - obj: the page tab list
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForPageTabList', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForProgressBar(self, obj, already_focused):
- '''Get the speech for a progress bar. If the object already
- had focus, just the new value is spoken.
-
- Arguments:
- - obj: the progress bar
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- value = obj.queryValue()
- percentValue = (value.currentValue / (value.maximumValue - value.minimumValue)) * 100
- percentage = _('%d percent.') % percentValue + ' '
- utterances = []
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self.getSpeechForObjectRole(obj))
-
- utterances.append(percentage)
- self._debugGenerator('_getSpeechForProgressBar', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForPushButton(self, obj, already_focused):
- '''Get the speech for a push button
-
- Arguments:
- - obj: the push button
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForPushButton', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForRadioButton(self, obj, already_focused):
- '''Get the speech for a radio button. If the button already had
- focus, then only the state is spoken.
-
- Arguments:
- - obj: the check box
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- state = obj.getState()
- if state.contains(pyatspi.STATE_CHECKED):
- selectionState = C_('radiobutton', 'selected')
- else:
- selectionState = C_('radiobutton', 'not selected')
- if not already_focused:
- utterances.extend(self._getSpeechForObjectName(obj))
- utterances.append(selectionState)
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- else:
- utterances.append(selectionState)
- self._debugGenerator('_getSpeechForRadioButton', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForRadioMenuItem(self, obj, already_focused):
- '''Get the speech for a radio menu item. If the menu item
- already had focus, then only the state is spoken.
-
- Arguments:
- - obj: the radio menu item
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- utterances.extend(self._getSpeechForRadioButton(obj, False))
- if not already_focused:
- self._addSpeechForObjectAccelerator(obj, utterances)
-
- self._debugGenerator('_getSpeechForRadioMenuItem', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForRowHeader(self, obj, already_focused):
- '''Get the speech for a row header.
-
- Arguments:
- - obj: the column header
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForRowHeader', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForScrollBar(self, obj, already_focused):
- '''Get the speech for a scroll bar.
-
- Arguments:
- - obj: the scroll bar
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForScrollBar', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForSlider(self, obj, already_focused):
- '''Get the speech for a slider. If the object already
- had focus, just the value is spoken.
-
- Arguments:
- - obj: the slider
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- valueString = self._script.getTextForValue(obj)
- if already_focused:
- utterances = [
- valueString]
- else:
- utterances = []
- utterances.extend(self._getSpeechForObjectLabel(obj))
- if not utterances:
- utterances.extend(self._getSpeechForObjectName(obj))
-
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.append(valueString)
- utterances.extend(self._getSpeechForRequiredObject(obj))
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._debugGenerator('_getSpeechForSlider', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForSpinButton(self, obj, already_focused):
- '''Get the speech for a spin button. If the object already has
- focus, then only the new value is spoken.
-
- Arguments:
- - obj: the spin button
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- if already_focused:
- utterances = [
- self._script.getDisplayedText(obj)]
- else:
- utterances = self._getDefaultSpeech(obj, already_focused)
- utterances.extend(self._getSpeechForRequiredObject(obj))
- self._debugGenerator('_getSpeechForSpinButton', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForSplitPane(self, obj, already_focused):
- '''Get the speech for a split pane.
-
- Arguments:
- - obj: the split pane
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- valueString = self._script.getTextForValue(obj)
- if already_focused:
- utterances = [
- valueString]
- else:
- utterances = []
- utterances.extend(self._getSpeechForObjectLabel(obj))
- if not utterances:
- utterances.extend(self._getSpeechForObjectName(obj))
-
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.append(valueString)
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- self._debugGenerator('_getSpeechForSplitPane', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTable(self, obj, already_focused):
- '''Get the speech for a table
-
- Arguments:
- - obj: the table
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForTable', obj, already_focused, utterances)
- if not obj.childCount:
- utterances.append(_('0 items'))
-
- return utterances
-
-
- def _getSpeechForTableCell(self, obj, already_focused):
- '''Get the speech utterances for a single table cell
-
- Arguments:
- - obj: the table
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if obj.childCount == 2:
- cellOrder = []
- hasToggle = [
- False,
- False]
- for i, child in enumerate(obj):
-
- try:
- action = child.queryAction()
- except NotImplementedError:
- continue
- continue
-
- for j in range(0, action.nActions):
- if action.getName(j) in [
- 'toggle',
- _('toggle')]:
- hasToggle[i] = True
- break
- continue
-
-
- if hasToggle[0] and not hasToggle[1]:
- cellOrder = [
- 1,
- 0]
- elif not hasToggle[0] and hasToggle[1]:
- cellOrder = [
- 0,
- 1]
-
- if cellOrder:
- for i in cellOrder:
- if already_focused and not hasToggle[i]:
- continue
- utterances.extend(self._getSpeechForTableCell(obj[i], already_focused))
-
- return utterances
-
-
- try:
- action = obj.queryAction()
- except NotImplementedError:
- action = None
-
- if action:
- for i in range(0, action.nActions):
- debug.println(debug.LEVEL_FINEST, 'speechgenerator.__getTableCellUtterances ' + 'looking at action %d' % i)
- if action.getName(i) in [
- 'toggle',
- _('toggle')]:
- utterances = self._getSpeechForCheckBox(obj, already_focused)
- break
- continue
-
-
- displayedText = self._script.getDisplayedText(self._script.getRealActiveDescendant(obj))
- if not already_focused and displayedText not in utterances:
- utterances.append(displayedText)
-
-
- try:
- image = obj.queryImage()
- except:
- image = None
-
- if (not displayedText or len(displayedText) == 0) and image:
- if not already_focused:
- if image.imageDescription:
- utterances.append(image.imageDescription)
-
- utterances.extend(self._getSpeechForImage(obj, already_focused))
-
-
- state = obj.getState()
- if state.contains(pyatspi.STATE_EXPANDABLE):
- if state.contains(pyatspi.STATE_EXPANDED):
- utterances.append(_('expanded'))
- childNodes = self._script.getChildNodes(obj)
- children = len(childNodes)
- if not children or settings.speechVerbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
- itemString = ngettext('%d item', '%d items', children) % children
- utterances.append(itemString)
-
- else:
- utterances.append(_('collapsed'))
-
- utterances.extend(self._getSpeechForRequiredObject(obj))
- self._debugGenerator('_getSpeechForTableCell', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTableCellRow(self, obj, already_focused):
- '''Get the speech for a table cell row or a single table cell
- if settings.readTableCellRow is False.
-
- Arguments:
- - obj: the table
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- if not already_focused:
-
- try:
- parent_table = obj.parent.queryTable()
- except NotImplementedError:
- parent_table = None
-
- if settings.readTableCellRow and parent_table and not self._script.isLayoutOnly(obj.parent):
- parent = obj.parent
- index = self._script.getCellIndex(obj)
- row = parent_table.getRowAtIndex(index)
- column = parent_table.getColumnAtIndex(index)
- speakAll = True
- if 'lastRow' in self._script.pointOfReference and 'lastColumn' in self._script.pointOfReference:
- pointOfReference = self._script.pointOfReference
- if not pointOfReference['lastRow'] != row:
- if row == 0 or row == parent_table.nRows - 1:
- pass
- speakAll = pointOfReference['lastColumn'] == column
-
- if speakAll:
- for i in range(0, parent_table.nColumns):
- cell = parent_table.getAccessibleAt(row, i)
- if not cell:
- debug.println(debug.LEVEL_WARNING, 'ERROR: speechgenerator.' + '_getSpeechForTableCellRow' + ' no accessible at (%d, %d)' % (row, i))
- continue
-
- state = cell.getState()
- showing = state.contains(pyatspi.STATE_SHOWING)
- if showing:
- label = self._script.getDisplayedText(self._script.getRealActiveDescendant(cell))
-
- try:
- action = cell.queryAction()
- except NotImplementedError:
- action = None
-
- if action:
- if label == None or len(label) == 0:
- for j in range(0, action.nActions):
- if action.getName(j) in [
- 'toggle',
- _('toggle')]:
- accHeader = parent_table.getColumnHeader(i)
- utterances.append(accHeader.name)
- continue
-
-
- utterances.extend(self._getSpeechForTableCell(cell, already_focused))
- continue
-
- else:
- utterances.extend(self._getSpeechForTableCell(obj, already_focused))
- else:
- utterances = self._getSpeechForTableCell(obj, already_focused)
- else:
- utterances = self._getSpeechForTableCell(obj, already_focused)
- self._debugGenerator('_getSpeechForTableCellRow', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTableColumnHeader(self, obj, already_focused):
- '''Get the speech for a table column header
-
- Arguments:
- - obj: the table column header
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getSpeechForColumnHeader(obj, already_focused)
- self._debugGenerator('_getSpeechForTableColumnHeader', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTableRowHeader(self, obj, already_focused):
- '''Get the speech for a table row header
-
- Arguments:
- - obj: the table row header
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getSpeechForRowHeader(obj, already_focused)
- self._debugGenerator('_getSpeechForTableRowHeader', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTearOffMenuItem(self, obj, already_focused):
- '''Get the speech for a tear off menu item
-
- Arguments:
- - obj: the tear off menu item
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- if settings.speechVerbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
- utterances = [
- rolenames.getSpeechForRoleName(obj)]
- else:
- utterances = [
- _('tear off')]
- self._debugGenerator('_getSpeechForTearOffMenuItem', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTerminal(self, obj, already_focused):
- '''Get the speech for a terminal
-
- Arguments:
- - obj: the terminal
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- title = None
- frame = self._script.getFrame(obj)
- if frame:
- title = frame.name
-
- if not title:
- title = self._script.getDisplayedLabel(obj)
-
- utterances = [
- title]
- self._debugGenerator('_getSpeechForTerminal', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForToggleButton(self, obj, already_focused):
- '''Get the speech for a toggle button. If the toggle button already
- had focus, then only the state is spoken.
-
- Arguments:
- - obj: the check box
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = []
- state = obj.getState()
- if state.contains(pyatspi.STATE_CHECKED) or state.contains(pyatspi.STATE_PRESSED):
- checkedState = _('pressed')
- else:
- checkedState = _('not pressed')
- if not already_focused:
- label = self._getSpeechForObjectLabel(obj)
- utterances.extend(label)
- name = self._getSpeechForObjectName(obj)
- if name != label:
- utterances.extend(name)
-
- utterances.extend(self.getSpeechForObjectRole(obj))
- utterances.append(checkedState)
- utterances.extend(self._getSpeechForObjectAvailability(obj))
- self._addSpeechForObjectMnemonic(obj, utterances)
- else:
- utterances.append(checkedState)
- self._debugGenerator('_getSpeechForToggleButton', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForToolBar(self, obj, already_focused):
- '''Get the speech for a tool bar
-
- Arguments:
- - obj: the tool bar
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForToolBar', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTree(self, obj, already_focused):
- '''Get the speech for a tree
-
- Arguments:
- - obj: the tree
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForTree', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForTreeTable(self, obj, already_focused):
- '''Get the speech for a tree table
-
- Arguments:
- - obj: the tree table
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForTreeTable', obj, already_focused, utterances)
- return utterances
-
-
- def _getSpeechForWindow(self, obj, already_focused):
- '''Get the speech for a window
-
- Arguments:
- - obj: the window
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken for the object.
- '''
- utterances = self._getDefaultSpeech(obj, already_focused)
- self._debugGenerator('_getSpeechForWindow', obj, already_focused, utterances)
- return utterances
-
-
- def getSpeech(self, obj, already_focused):
- '''Get the speech for an Accessible object. This will look
- first to the specific speech generators and then to the
- default speech generator. This method is the primary method
- that external callers of this class should use.
-
- Arguments:
- - obj: the object
- - already_focused: False if object just received focus
-
- Returns a list of utterances to be spoken.
- '''
- role = obj.getRole()
- if role in self.speechGenerators:
- generator = self.speechGenerators[role]
- else:
- generator = self._getDefaultSpeech
- return [
- ' '.join(generator(obj, already_focused))]
-
-
- def getSpeechContext(self, obj, stopAncestor = None):
- '''Get the speech that describes the names and role of
- the container hierarchy of the object, stopping at and
- not including the stopAncestor.
-
- Arguments:
- - obj: the object
- - stopAncestor: the anscestor to stop at and not include (None
- means include all ancestors)
-
- Returns a list of utterances to be spoken.
- '''
- utterances = []
- if not obj:
- return utterances
- if obj == stopAncestor:
- return utterances
- parent = obj.parent
- while parent and parent.parent != parent:
- if parent == stopAncestor:
- break
-
- if not self._script.isLayoutOnly(parent):
- text = self._script.getDisplayedLabel(parent)
- if not text and 'Text' in pyatspi.listInterfaces(parent):
- text = self._script.getDisplayedText(parent)
-
- if text and len(text.strip()):
- if parent.getRole() not in [
- pyatspi.ROLE_TABLE_CELL,
- pyatspi.ROLE_FILLER]:
- utterances.extend(self.getSpeechForObjectRole(parent))
-
- utterances.append(text)
- if parent.getRole() == pyatspi.ROLE_TABLE_CELL:
- utterances.extend(self.getSpeechForObjectRole(parent))
-
-
-
- parent = parent.parent
- utterances.reverse()
- return utterances
-
-
-